package com.zdh.strategy.kit;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public interface Tuple {
    class T2<_0, _1> {
        public _0 _0;
        public _1 _1;

        public T2() {
        }

        private T2(_0 _0, _1 _1) {
            this._0 = _0;
            this._1 = _1;
        }

        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("_0", _0)
                    .append("_1", _1)
                    .toString();
        }
    }

    class T3<_0, _1, _2> extends T2<_0, _1> {
        public _2 _2;

        public T3() {
        }

        private T3(_0 _0, _1 _1, _2 _2) {
            super(_0, _1);
            this._2 = _2;
        }

        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("_0", _0)
                    .append("_1", _1)
                    .append("_2", _2)
                    .toString();
        }
    }

    class T4<_0, _1, _2, _3> extends T3<_0, _1, _2> {
        public _3 _3;

        public T4() {
        }

        private T4(_0 _0, _1 _1, _2 _2, _3 _3) {
            super(_0, _1, _2);
            this._3 = _3;
        }

        @Override
        public String toString() {
            return new ToStringBuilder(this)
                    .append("_0", _0)
                    .append("_1", _1)
                    .append("_2", _2)
                    .append("_3", _3)
                    .toString();
        }
    }

    class T5<_0, _1, _2, _3, _4> extends T4<_0, _1, _2, _3> {
        public _4 _4;

        public T5() {
        }

        private T5(_0 _0, _1 _1, _2 _2, _3 _3, _4 _4) {
            super(_0, _1, _2, _3);
            this._4 = _4;
        }

        @Override
        public String toString() {
            return new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE)
                    .append("_0", _0)
                    .append("_1", _1)
                    .append("_2", _2)
                    .append("_3", _3)
                    .append("_4", _4)
                    .toString();
        }
    }

    static <_0, _1> T2<_0, _1> create(_0 _0, _1 _1) {
        return new T2<>(_0, _1);
    }

    static <_0, _1, _2> T3<_0, _1, _2> create(_0 _0, _1 _1, _2 _2) {
        return new T3<>(_0, _1, _2);
    }

    static <_0, _1, _2, _3> T4<_0, _1, _2, _3> create(_0 _0, _1 _1, _2 _2, _3 _3) {
        return new T4<>(_0, _1, _2, _3);
    }

    static <_0, _1, _2, _3, _4> T5<_0, _1, _2, _3, _4> create(_0 _0, _1 _1, _2 _2, _3 _3, _4 _4) {
        return new T5<>(_0, _1, _2, _3, _4);
    }
}
